import VuiClipboardCommon from './common';
import VuiClipboardDataItem from './data-item';

/*
 *
 * @Author: Jevon
 * @Date: 2021-12-16 10:55:57
 */
const VuiClipboardEventUtils = (function() {
  /**
   * 设置数据
   * @param {*} evt
   * @param {VuiClipboardDataItem} item
   * @return {*}
   */
  function setData(evt, item) {
    // 兼容ie||chrome
    const clipboardData = window.clipboardData || evt.originalEvent.clipboardData;
    // 设置剪切板内容
    if (item instanceof VuiClipboardDataItem) {
      item.each((format, data) => {
        clipboardData.setData(format, data);
      });
    }
  }

  /**
   * 获取指定格式的数据
   * @param {*} evt
   * @param {*} format
   * @return {*}
   */
  function getData(evt, format) {
    // 兼容ie||chrome
    const clipboardData = window.clipboardData || evt.originalEvent.clipboardData;
    // 获取剪切板内容
    return clipboardData.getData(format);
  }

  /**
   * 检查是否支持ClipboardEvent
   * @param {*}
   * @return {*}
   */
  function check() {
    // clipboardData对象内兼容大部分pc浏览器，像chrome，firefox、ie等，
    // 但是在手机端兼容性不是很好，目前clipboardData在ios上的safari浏览器无效
    return navigator.userAgent.indexOf('Safari') === -1;
  }
  /**
   * 向剪切板写入文本
   * @param {*} data
   * @param {*} evt
   * @return {*}
   */
  function writeText(data, evt) {
    const item = new VuiClipboardDataItem();
    item.text(data);
    return write(item, evt);
  }
  /**
   * 读取剪切板中的文本
   * @param {*} evt
   * @return {*}
   */
  function readText(evt) {
    return read(VuiClipboardDataItem.text, evt);
  }
  /**
   * 向剪切板写入内容
   *
   * @param { VuiClipboardDataItem } item
   * @return {*}
   */
  function write(item, evt) {
    return new Promise((resolve, reject) => {
      try {
        if (evt && evt.originalEvent.clipboardData) {
          setData(evt, item);
          resolve('success');
        } else {
          VuiClipboardCommon.triggerClipboard('copy', e => {
            setData(e, item);
            resolve('success');
          });
        }
      } catch (error) {
        reject('write error');
      }
    });
  }
  /**
   * 根据类型读取剪切板
   * @param {*} format
   * @return {*}
   */
  function read(format, evt) {
    return new Promise((resolve, reject) => {
      try {
        if (evt && evt.originalEvent.clipboardData) {
          const data = getData(evt, format);
          resolve(data);
        } else {
          VuiClipboardCommon.triggerClipboard('paste', e => {
            const data = getData(e, format);
            resolve(data);
          });
        }
      } catch (error) {
        reject('read error');
      }
    });
  }

  return {
    check,
    writeText,
    readText,
    write,
    read
  };
})();
export default VuiClipboardEventUtils;
